254. StatefulSet呼叫pod的方法

WHY

延續上篇 252. k8s中的pod呼叫 ,那篇文章中,
要直接去call statefulSet的pod,
透過ip反查,找到DNS,
但如果IP反查也找不到DNS呢?

Solution

在建立srs服務時,
根據之前的測試方式,提供RD 溝通的網址,
但上線時,一查 這個網址沒有指定,
IP也沒有對應的FQDN。

於是,才發現是sts(StatefulSet的縮寫)的設定問題。
如果要直接跟sts的pod連線時,需要使用headless service

無頭 Service 不使用虛擬 IP 地址和代理 組態路由和封包轉發;相反,無頭 Service 通過內部 DNS 記錄報告各個 Pod 的端點 IP 地址,這些 DNS 記錄是由叢集的 DNS 服務所提供的。

要使用Headless service的話,則需設定 clusterIP: none
但 sts指定的service name要指定是有設定 Headless service的service。

sts.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: srs-edge
  namespace: srs-qa
spec:
  replicas: 2
  serviceName: srs-edge
  selector:
    matchLabels:
      app: srs-edge

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: srs-edge
  namespace: srs-qa
spec:
  clusterIP: None
  selector:
    app: srs-edge

這樣就能夠使用 <podName>.<serviceName>.<nameSpace>.svc.cluster.local 去呼叫pod了。

不放心,可以參考上一篇252. k8s中的pod呼叫用nslookup驗證FQDN

ref. StatefulSet